﻿using System.Collections.Generic;
using System.Drawing;
using GraphDrawing.Concrete;
using GraphDrawing.Graph.Behaviors;
using GraphDrawing.Graph.Model;

namespace GraphDrawing.Model
{
    public class MyModel
    {
        /// <summary>
        /// Отображение из идентификатора элемента в фабрику для создания его блоков.
        /// </summary>
        readonly Dictionary<string, IBlockFactory> toolboxFactories = new Dictionary<string, IBlockFactory>();

        /// <summary>
        /// Список элементов на тулбоксе.
        /// </summary>
        public IList<ToolboxItem> ToolboxItems { get; private set; }

        /// <summary>
        /// Контейнер представлений для объектов.
        /// </summary>
        public IGraphObjectViewContainer ViewContainer { get; private set; }

        /// <summary>
        /// Модель графа.
        /// </summary>
        public GraphModel GraphModel { get; private set; }

        public MyModel()
        {
            GraphModel = new GraphModel();
            ViewContainer = new GraphObjectViewContainer();
            ToolboxItems = new List<ToolboxItem>();
            CreateToolboxItems();
        }

        public void PutBlock(string toolboxItemId, Point position)
        {
            var factory = toolboxFactories[toolboxItemId];
            var viewModel = factory.Create();
            ViewContainer.Add(viewModel.view, viewModel.block);
            GraphModel.AddBlock(viewModel.block, position);
        }

        /// <summary>
        /// Создаёт элементы для отображения в панели инструментов.
        /// </summary>
        void CreateToolboxItems()
        {
            RegisterToolboxItem("1", "Logic OR", "Logical OR function", "image", new LogicalOrBlockFactory());
        }

        /// <summary>
        /// Добавляет описание элемента в панель инструмента и регистрирует связанную с ним фабрику блоков.
        /// </summary>
        /// <param name="id">Уникальный идентификатор элемента.</param>
        /// <param name="imageKey">Ключ картинки для отображения в панели инструментов.</param>
        /// <param name="factory">Фабрика для создания элементов.</param>
        /// <param name="displayName">Отображаемое имя элемента.</param>
        /// <param name="tooltip">Текст всплывающей подсказки.</param>
        void RegisterToolboxItem(string id, string displayName, string tooltip, string imageKey, IBlockFactory factory)
        {
            ToolboxItems.Add(new ToolboxItem(id, displayName, tooltip, imageKey));
            toolboxFactories.Add(id, factory);
        }
    }
}